App Store Receipt Validation এবং Security iOS অ্যাপ্লিকেশনের নিরাপত্তা নিশ্চিত করার একটি গুরুত্বপূর্ণ অংশ, বিশেষ করে যখন আপনি In-app Purchases (IAP) এবং সাবস্ক্রিপশন ব্যবহার করেন। সঠিকভাবে রিসিপ্ট ভ্যালিডেট করা এবং অ্যাপ্লিকেশনের নিরাপত্তা বজায় রাখা আপনার অ্যাপের ইনকাম সুরক্ষিত রাখতে সাহায্য করে এবং পাইরেসি বা জালিয়াতি থেকে রক্ষা করে। এখানে App Store Receipt Validation এবং Security নিয়ে বিস্তারিত আলোচনা করা হলো।
App Store Receipt Validation
রিসিপ্ট ভ্যালিডেশন নিশ্চিত করে যে ব্যবহারকারী বৈধভাবে অ্যাপটি কিনেছেন এবং যেকোনো In-app Purchase বা সাবস্ক্রিপশন বৈধ। Apple এর App Store একটি Receipt প্রদান করে, যা অ্যাপের ক্রয় তথ্য ধারণ করে। এই রিসিপ্টটিকে যাচাই করে আপনি নিশ্চিত করতে পারেন যে কোনো In-app Purchase বৈধ কিনা।
Receipt Validation এর ধাপসমূহ
Step 1: রিসিপ্ট ফাইল রিট্রিভ করা
অ্যাপের রিসিপ্ট Bundle এ সংরক্ষিত থাকে। আপনি নিচের কোড ব্যবহার করে রিসিপ্ট রিট্রিভ করতে পারেন:
func fetchReceipt() -> Data? {
guard let appStoreReceiptURL = Bundle.main.appStoreReceiptURL else { return nil }
do {
let receiptData = try Data(contentsOf: appStoreReceiptURL)
return receiptData
} catch {
print("Error fetching receipt data: \(error)")
return nil
}
}
ব্যাখ্যা:
- appStoreReceiptURL: এটি App Store রিসিপ্ট ফাইলের লোকেশন প্রদান করে।
- Data(contentsOf:): রিসিপ্ট ফাইল থেকে ডেটা লোড করে।
Step 2: রিসিপ্ট লোকালি যাচাই করা
iOS 7 এর পর থেকে আপনি লোকালি রিসিপ্ট যাচাই করতে পারেন। এজন্য OpenSSL এবং Apple এর Public Key ব্যবহার করে যাচাই করতে হয়। তবে, এটি কিছুটা জটিল এবং সাধারণত এটি ব্যবহারের পরিবর্তে Server-side Validation বেশি কার্যকর।
Step 3: Server-side Validation
Server-side Validation ব্যবহার করা আরো নিরাপদ, কারণ রিসিপ্ট যাচাই আপনার নিজস্ব সার্ভারে সম্পন্ন হয় এবং ডিভাইসের বাইরে সম্পূর্ণ হয়। এটি Apple এর ভেরিফিকেশন API ব্যবহার করে করে থাকে।
- রিসিপ্ট ডেটা বেস৬৪ এ এনকোড করা: রিসিপ্ট ভেরিফিকেশন করার জন্য আপনাকে রিসিপ্ট ডেটা বেস৬৪ ফরম্যাটে রূপান্তর করতে হবে:
if let receiptData = fetchReceipt() {
let receiptString = receiptData.base64EncodedString()
// রিসিপ্ট স্ট্রিং সার্ভারে পাঠান
}
সার্ভারে ভেরিফিকেশন রিকোয়েস্ট পাঠানো:
- আপনার সার্ভার Apple এর Receipt Validation Endpoint এ POST রিকোয়েস্ট পাঠাবে।
- Production URL:
https://buy.itunes.apple.com/verifyReceipt - Sandbox URL:
https://sandbox.itunes.apple.com/verifyReceipt
POST Request Example:
{
"receipt-data": "RECEIPT_DATA",
"password": "YOUR_SHARED_SECRET"
}
- receipt-data: আপনার বেস৬৪ এনকোড করা রিসিপ্ট।
- password: In-app Subscription এর জন্য
App Store Connectএ প্রদান করা Shared Secret।
- Response এবং Validation:
- Apple রেসপন্স ফেরত দেয় এবং আপনি সেই রেসপন্স যাচাই করেন। রেসপন্সটি JSON ফরম্যাটে আসে এবং এর মধ্যে
statusএবংreceiptসম্পর্কিত তথ্য থাকে। - Status Code: ০ মানে সফল এবং অন্য মানগুলো এরর নির্দেশ করে।
- Apple রেসপন্স ফেরত দেয় এবং আপনি সেই রেসপন্স যাচাই করেন। রেসপন্সটি JSON ফরম্যাটে আসে এবং এর মধ্যে
{
"status": 0,
"receipt": {
"bundle_id": "com.yourcompany.app",
"in_app": [
{
"product_id": "com.yourapp.product1",
"transaction_id": "10000000000001",
"purchase_date": "2024-10-01 10:00:00 Etc/GMT"
}
]
}
}
- Status 0: রিসিপ্ট বৈধ।
- in_app: In-app Purchases এর ডেটা ধারণ করে। আপনি এখানে
product_id,transaction_id, এবংpurchase_dateযাচাই করতে পারেন।
Step 4: Validate Subscription Status
সাবস্ক্রিপশন প্রোডাক্টের জন্য, আপনাকে expires_date যাচাই করতে হবে, যা রিসিপ্টের ভেতরে থাকে।
func validateSubscription(receipt: [String: Any]) -> Bool {
guard let latestReceiptInfo = receipt["latest_receipt_info"] as? [[String: Any]],
let expirationDateString = latestReceiptInfo.last?["expires_date"] as? String,
let expirationDate = ISO8601DateFormatter().date(from: expirationDateString) else {
return false
}
return expirationDate > Date()
}
ব্যাখ্যা:
- latest_receipt_info: এটি সাবস্ক্রিপশনের সর্বশেষ তথ্য ধারণ করে।
- expires_date: সাবস্ক্রিপশনের মেয়াদ শেষ হওয়ার তারিখ, যা যাচাই করে আপনি সাবস্ক্রিপশন বৈধ কিনা তা জানতে পারেন।
Step 5: Security Best Practices
রিসিপ্ট ভ্যালিডেশনের সময় সিকিউরিটি নিশ্চিত করা গুরুত্বপূর্ণ। নিচে কিছু সেরা চর্চা উল্লেখ করা হলো:
- Server-side Validation ব্যবহার করুন: ক্লায়েন্ট সাইডের পরিবর্তে রিসিপ্ট যাচাই সার্ভার সাইডে করা অধিক নিরাপদ।
- HTTPS ব্যবহার করুন: সবসময় HTTPS ব্যবহার করুন, যাতে আপনার রিকোয়েস্ট এবং রেসপন্স এনক্রিপ্টেড থাকে।
- Transaction ID লগ রাখুন: প্রতিটি ট্রানজ্যাকশন আইডি সংরক্ষণ করুন এবং একই আইডি পুনরায় ব্যবহার করা হলে তা বাতিল করুন।
- Jailbreak Detection: যদি অ্যাপটি জেলব্রোকেন ডিভাইসে চালানো হয়, তাহলে রিসিপ্ট ভেরিফাই করতে না দেয়ার ব্যবস্থা নিন।
- Obfuscate and Encrypt Data: সংবেদনশীল ডেটা এনক্রিপ্ট করে সংরক্ষণ করুন এবং সোর্স কোড ওবফুসকেট করুন, যাতে অ্যাপটি কম রিভার্স ইঞ্জিনিয়ারিং করা যায়।
- Dynamic Validation Logic ব্যবহার করুন: অ্যাপের সিকিউরিটি বাড়ানোর জন্য ডাইনামিক লজিক ব্যবহার করুন এবং তা প্রায়ই পরিবর্তন করুন।
Additional Features: Receipt Refresh
অ্যাপ স্টোর রিসিপ্ট আপডেট করার জন্য:
func refreshReceipt() {
let request = SKReceiptRefreshRequest()
request.delegate = self
request.start()
}
উপসংহার
App Store Receipt Validation এবং Security অ্যাপ্লিকেশনের ডেটা এবং ইকোসিস্টেম সুরক্ষিত রাখতে গুরুত্বপূর্ণ। StoreKit Framework এবং Server-side Validation ব্যবহার করে আপনি রিসিপ্ট ভ্যালিডেশন করতে পারেন এবং ব্যবহারকারীর ক্রয়ের সঠিকতা যাচাই করতে পারেন। এটি নিশ্চিত করে যে আপনার অ্যাপ থেকে আয় সুরক্ষিত থাকে এবং কোনো জালিয়াতি বা পাইরেসি প্রতিরোধ করা যায়।
Read more